package com.teamwhole.core.persistence.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import com.github.pagehelper.Page;
import com.teamwhole.core.persistence.BaseEntity;
import com.teamwhole.core.persistence.dao.CrudDao;

/**
 * Service基类
 * 
 * @author ZGJ
 * 
 * @param <D>
 * @param <T>
 */
@Transactional(readOnly = true)
public abstract class CrudService<D extends CrudDao<T>, T extends BaseEntity<T>>
        extends BaseService {

    // 持久层对象
    @Autowired
    protected D dao;

    /**
     * 获取单条数据
     * 
     * @param id
     * @return
     */
    public T get(String id) {
        return dao.get(id);
    }

    /**
     * 获取单条数据
     * 
     * @param entity
     * @return
     */
    public T get(T entity) {
        return dao.get(entity);
    }

    /**
     * 查询列表数据
     * 
     * @param entity
     * @return
     */
    public List<T> findList(T entity) {
        return dao.findList(entity);
    }

    /**
     * 查询分页数据(需手动设置分页参数)
     * 
     * @param entity
     * @return Page
     */
//    public Page<T> findPage(Page<T> page, T entity) {
//        return (Page<T>) dao.findList(entity);
//    }

    /**
     * 查询分页数据
     * 
     * @param page 分页对象
     * @param entity
     * @return Page
     */
    public Page<T> findPage(T entity) {
        entity.startPage();
        return (Page<T>) dao.findList(entity);
    }

    /**
     * 保存数据/插入或更新
     * 
     * @param entity
     */
    @Transactional(readOnly = false)
    public void save(T entity) {
        if (entity.isNewRecord()) {
            entity.preInsert();
            dao.insert(entity);
        } else {
            entity.preUpdate();
            dao.update(entity);
        }
    }

    /**
     * 删除数据
     * 
     * @param entity
     */
    @Transactional(readOnly = false)
    public void delete(String id) {
        dao.delete(id);
    }

    /**
     * 删除数据
     * 
     * @param entity
     */
    @Transactional(readOnly = false)
    public void delete(T entity) {
        dao.delete(entity);
    }

}
